package com.ydgk.servlet;

import com.ydgk.bean.Pclass;
import com.ydgk.bean.Product;
import com.ydgk.service.PclassService;
import com.ydgk.service.ProductService;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.Map;

@WebServlet("/ProductServlet.action")
public class ProductServlet extends BaseServlet{
    private static final String UPLOAD_DIRECTORY = "images";
    // 上传配置
    private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3;  // 3MB
    private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
    private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB
    protected void adminSaveOrUpdate(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext application = request.getServletContext();
        PrintWriter out = response.getWriter();
        // 检测是否为多媒体上传,如果没有就不用做后续的处理了
        if (!ServletFileUpload.isMultipartContent(request)) {
            // 如果不是则停止
            out.flush();
            return;
        }
        // 配置上传参数
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
        factory.setSizeThreshold(MEMORY_THRESHOLD);
        // 设置临时存储目录
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
        //ServletFileUpload就是用户获取用户提交上来的文件信息,还有表单中的文本信息
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 设置最大文件上传值
        upload.setFileSizeMax(MAX_FILE_SIZE);
        // 设置最大请求值 (包含文件和表单数据)
        upload.setSizeMax(MAX_REQUEST_SIZE);
        // 中文处理
        upload.setHeaderEncoding("UTF-8");
        // 构造临时路径来存储上传的文
        // 这个路径相对当前应用的目录
        String uploadPath = application.getRealPath(UPLOAD_DIRECTORY);
        // 如果目录不存在则创建
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();//建upload文件
        }
        Product product=new Product();
        try {
            //将request对象进行转换.,转换成FileItem集合
            List<FileItem> list = upload.parseRequest(request);
            for (FileItem fileItem : list) {
                //isFormField()如果是true就是普通文本内容,如果是false的话就是要上传的文件
                if (fileItem.isFormField()) {
                    //文本处理
                    String value = fileItem.getString("utf-8");
                    //System.out.println(fileItem.getFieldName()+":"+value);
                    BeanUtils.setProperty(product, fileItem.getFieldName(), value);
                } else {
                    if (fileItem.getSize() > 0) {
                        //删除旧的图片
                        if( product.getImage() != null && !product.getImage().equals("")){
                            File f = new File(application.getRealPath("") + "/" + product.getImage());
                            System.out.println(f.getAbsolutePath());
                            f.delete();
                        }
                        //文件上传
                        String fileName = fileItem.getName(); //上传的文件名字
                        int index = fileName.lastIndexOf(".");
                        String newfilename = Math.random() + fileName.substring(index);
                        //c:/xxx/xxx/xxx/xxx/upload/123. gif
                        File f = new File(uploadPath + "/" + newfilename);
                        // 保存文件到硬盘
                        fileItem.write(f);//文件写入
                        //保存到数据库的图片路径是相对路径,不能用绝对路径
                        product.setImage(UPLOAD_DIRECTORY + "/" + newfilename);

                    }
                }
            }
            ProductService productService=new ProductService();
            int i = productService.saveOrUpdate(product);
            if(i>0){
                response.sendRedirect("ProductServlet.action?flag=findProduct");
            }else{
                response.getWriter().print("操作失败");
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    protected void findProduct(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String productName=request.getParameter("productName");
        String pn=request.getParameter("pageNumber");
        Integer pageNumber=null;
        PclassService pclassService=new PclassService();
        try {
            pageNumber = Integer.parseInt(pn);
        }catch (NumberFormatException e){
            pageNumber = 1 ;
        }
        System.out.println("pageNumber="+pageNumber);
        ProductService productService=new ProductService();
        Map map=productService.AdminSearch(productName,pageNumber);
        List<Product> productList=(List<Product>)map.get("productList");
        String pageCode = (String)map.get("pageCode");
        request.setAttribute("pageCode",pageCode);
        request.setAttribute("productList",productList);
        request.setAttribute("productName",productName);
        request.setAttribute("s","4");
        request.getRequestDispatcher("ProductManagement.jsp").forward(request,response);
    }
    protected void deleteById(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Product product=new Product();
        ProductService productService=new ProductService();
        String id=request.getParameter("id");
        Integer i =null;
        try{
            i=productService.deleteById(Integer.parseInt(id));
        }catch (NumberFormatException e) {
        }
        PrintWriter out=response.getWriter();
        out.print(i>0?true:false);
    }
    protected void deletes(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Product product=new Product();
        ProductService productService=new ProductService();
        String ids=request.getParameter("ids");
        String[] s=ids.split(",");
        Integer i=null;
        for (String s1 : s) {
            try{
                i=productService.deleteById(Integer.parseInt(s1));
            }catch (NumberFormatException e) {
            }
            System.out.println(i);
        }
        PrintWriter out=response.getWriter();
        out.print(i>0?true:false);
    }
}
